package com.yj.idempotence.thread;

import java.util.LinkedList;

public class Demo07 {
    public static void main(String[] args) {
        ProducerAndConsumerFactory factory = new ProducerAndConsumerFactory();
        new Thread(() -> {

            int i = 1;
            while (true) {
                factory.produce(String.valueOf(i));
                i++;
            }
        }, "生产者").start();

        new Thread(() -> {


            while (true) {
                factory.consume();

            }
        }, "消费者").start();
    }
}

class ProducerAndConsumerFactory{

    private LinkedList<String> linkedList;

    public ProducerAndConsumerFactory(){
        linkedList = new LinkedList<>();
    }

    public synchronized void produce(String name){

//        while (linkedList.size() == 10){
//            try {
//                System.out.println("当前库存已经达到最大值：10");
//                wait();
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
//        }
//        linkedList.add(name);
//        System.out.println("生产者已经生产了一个商品："+name);
//        try {
//            Thread.sleep(2000);
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }
//        notify();
        while (10 == linkedList.size()) { //根据需求：如果达到 10 库存，停止生产
            try {
                System.out.println("警告：线程("+Thread.currentThread().getName() + ")准备生产产品，但产品池已满");
                wait(); // 库存达到 10 ，生产线程进入 wait 状态
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        linkedList.add(name); //如果没有到 10 库存，进行产品添加
        try {
            Thread.sleep(2000); //根据需求为了便于观察结果，每生产一个产品，sleep 5000 ms
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("线程("+Thread.currentThread().getName() + ")生产了一件产品:" + linkedList+";当前剩余商品"+linkedList.size()+"个");
        notify(); //生产了产品，通知消费者线程从 wait 状态唤醒，进行消费
    }

    public synchronized void consume(){

//        while (linkedList.size() == 0){
//            try {
//                System.out.println("警告：线程("+Thread.currentThread().getName() + ")准备消费产品，但当前没有产品");
//                wait();
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
//        }
//        linkedList.pop();
//        try {
//            Thread.sleep(2000);
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }
//        System.out.println("线程("+Thread.currentThread().getName() + ")消费了一件产品:" + linkedList+";当前剩余商品"+linkedList.size()+"个");
//        notify();

        while (linkedList.size()==0) { //根据需求：没有库存消费者进入wait状态
            try {
                System.out.println("警告：线程("+Thread.currentThread().getName() + ")准备消费产品，但当前没有产品");
                wait(); //库存为 0 ，无法消费，进入 wait ，等待生产者线程唤醒
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        String product = linkedList.remove(0) ; //如果有库存则消费，并移除消费掉的产品
        try {
            Thread.sleep(2000);//根据需求为了便于观察结果，每消费一个产品，sleep 5000 ms
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("线程("+Thread.currentThread().getName() + ")消费了一件产品:" + product+";当前剩余商品"+linkedList.size()+"个");
        notify();// 通知生产者继续生产

    }


}

